home *** CD-ROM | disk | FTP | other *** search
Wrap
package netscape.ldap; import java.lang.reflect.Method; import java.util.Enumeration; import java.util.Hashtable; import java.util.Properties; import java.util.StringTokenizer; import java.util.Vector; import netscape.ldap.client.JDAPAVA; import netscape.ldap.client.JDAPMessage; import netscape.ldap.client.opers.JDAPAbandonRequest; import netscape.ldap.client.opers.JDAPAddRequest; import netscape.ldap.client.opers.JDAPBindRequest; import netscape.ldap.client.opers.JDAPBindResponse; import netscape.ldap.client.opers.JDAPCompareRequest; import netscape.ldap.client.opers.JDAPDeleteRequest; import netscape.ldap.client.opers.JDAPExtendedRequest; import netscape.ldap.client.opers.JDAPExtendedResponse; import netscape.ldap.client.opers.JDAPModifyRDNRequest; import netscape.ldap.client.opers.JDAPModifyRequest; import netscape.ldap.client.opers.JDAPProtocolOp; import netscape.ldap.client.opers.JDAPResult; import netscape.ldap.client.opers.JDAPSearchRequest; import netscape.ldap.client.opers.JDAPSearchResult; import netscape.ldap.client.opers.JDAPSearchResultReference; public class LDAPConnection implements LDAPv3, Cloneable { public static final int LDAP_VERSION = 2; public static final String LDAP_PROPERTY_SDK = "version.sdk"; public static final String LDAP_PROPERTY_PROTOCOL = "version.protocol"; public static final String LDAP_PROPERTY_SECURITY = "version.security"; private static final String defaultFilter = "(objectClass=*)"; private static final LDAPSearchConstraints readConstraints = new LDAPSearchConstraints(); private transient LDAPSearchConstraints defaultConstraints = new LDAPSearchConstraints(); private transient Vector responseListeners; private transient Vector searchListeners; private transient boolean bound; private transient String host; private transient String[] m_hostList; private transient int port = -1; private transient int[] m_portList; private transient int m_defaultPort; private transient String prevBoundDN; private transient String prevBoundPasswd; private transient String boundDN; private transient String boundPasswd; private transient int protocolVersion = 2; private transient LDAPSocketFactory m_factory; // $FF: renamed from: th netscape.ldap.LDAPConnThread private transient LDAPConnThread field_0; private transient Vector m_attachedList = new Vector(); private transient Hashtable m_responseControlTable = new Hashtable(); private transient LDAPCache m_cache; static Hashtable m_threadConnTable = new Hashtable(); private boolean m_anonymousBound = false; private Object m_security; private boolean saslBind = false; private Object m_mechanismDriver; private Properties m_securityProperties; private Object m_clientCB; private Hashtable m_methodLookup = new Hashtable(); private LDAPConnection m_referralConnection; private static final Float SdkVersion = new Float(3.1F); private static final Float ProtocolVersion = new Float(3.0F); private static final String SecurityVersion = new String("none,simple,sasl"); private static final Float MajorVersion = new Float(3.0F); private static final Float MinorVersion = new Float(0.1F); private static final String DELIM = "#"; private static final String PersistSearchPackageName = "netscape.ldap.controls.LDAPPersistSearchControl"; private static final String EXTERNAL_MECHANISM = "SASLExternalMechanism"; private static final String EXTERNAL_MECHANISM_PACKAGE = "com.netscape.sasl.mechanisms"; public static final int MAXBACKLOG = 30; private static boolean isCommunicator = checkCommunicator(); private static final boolean debug = false; public LDAPConnection() { this.m_factory = null; } public LDAPConnection(LDAPSocketFactory var1) { this.m_factory = var1; } public void finalize() throws LDAPException { if (this.field_0 != null) { this.disconnect(); } } public void setCache(LDAPCache var1) { this.m_cache = var1; } public LDAPCache getCache() { return this.m_cache; } public Object getProperty(String var1) throws LDAPException { if (var1.equals("version.sdk")) { return SdkVersion; } else if (var1.equals("version.protocol")) { return ProtocolVersion; } else if (var1.equals("version.security")) { return SecurityVersion; } else if (var1.equals("version.major")) { return MajorVersion; } else { return var1.equals("version.minor") ? MinorVersion : null; } } public void setProperty(String var1, Object var2) throws LDAPException { throw new LDAPException("No property has been set"); } private void setProtocolVersion(int var1) { this.protocolVersion = var1; } public String getHost() { return this.host; } public int getPort() { return this.port; } public String getAuthenticationDN() { return this.boundDN; } public String getAuthenticationPassword() { return this.boundPasswd; } public LDAPSocketFactory getSocketFactory() { return this.m_factory; } public void setSocketFactory(LDAPSocketFactory var1) { this.m_factory = var1; } public boolean isConnected() { Thread.yield(); return this.field_0 != null; } public boolean isAuthenticated() { return !this.bound || this.boundDN != null && !this.boundDN.equals("") && this.boundPasswd != null && !this.boundPasswd.equals("") ? this.bound : false; } public void connect(String var1, int var2) throws LDAPException { this.connect(var1, var2, (String)null, (String)null, this.defaultConstraints, false); } public void connect(String var1, int var2, String var3, String var4) throws LDAPException { this.connect(var1, var2, var3, var4, this.defaultConstraints, true); } public void connect(String var1, int var2, String var3, String var4, LDAPSearchConstraints var5) throws LDAPException { this.connect(var1, var2, var3, var4, var5, true); } private void connect(String var1, int var2, String var3, String var4, LDAPSearchConstraints var5, boolean var6) throws LDAPException { if (this.field_0 != null) { this.disconnect(); } if (var1 != null && !var1.equals("")) { this.m_defaultPort = var2; StringTokenizer var7 = new StringTokenizer(var1); this.m_hostList = new String[var7.countTokens()]; this.m_portList = new int[var7.countTokens()]; for(int var8 = 0; var7.hasMoreTokens(); ++var8) { String var9 = var7.nextToken(); int var10 = var9.indexOf(58); if (var10 > 0) { this.m_hostList[var8] = var9.substring(0, var10); this.m_portList[var8] = Integer.parseInt(var9.substring(var10 + 1)); } else { this.m_hostList[var8] = var9; this.m_portList[var8] = this.m_defaultPort; } } LDAPException var13 = null; for(int var12 = 0; var12 < this.m_hostList.length; ++var12) { try { this.host = this.m_hostList[var12]; this.port = this.m_portList[var12]; this.connect(); var13 = null; break; } catch (LDAPException var11) { var13 = var11; } } if (var13 != null) { this.host = this.m_hostList[0]; this.port = this.m_defaultPort; throw var13; } else { if (var6) { this.authenticate(var3, var4, var5); } } } else { throw new LDAPException("no host for connection", 89); } } public void connect(int var1, String var2, int var3, String var4, String var5) throws LDAPException { this.connect(var1, var2, var3, var4, var5, this.defaultConstraints); } public void connect(int var1, String var2, int var3, String var4, String var5, LDAPSearchConstraints var6) throws LDAPException { this.protocolVersion = var1; this.connect(var2, var3, var4, var5, var6); } private synchronized void connect() throws LDAPException { if (this.field_0 == null) { if (this.host != null && this.port >= 0) { this.field_0 = this.getNewThread(this.host, this.port, this.m_factory, this.m_cache); } else { throw new LDAPException("no connection parameters", 89); } } } private synchronized LDAPConnThread getNewThread(String var1, int var2, LDAPSocketFactory var3, LDAPCache var4) throws LDAPException { LDAPConnThread var5 = null; Vector var6 = null; Hashtable var7 = m_threadConnTable; synchronized(var7){} try { Enumeration var9 = m_threadConnTable.keys(); boolean var10 = false; while(var9.hasMoreElements()) { LDAPConnThread var11 = (LDAPConnThread)var9.nextElement(); Vector var12 = (Vector)m_threadConnTable.get(var11); Enumeration var13 = var12.elements(); while(var13.hasMoreElements()) { LDAPConnection var14 = (LDAPConnection)var13.nextElement(); if (var14.equals(this)) { var10 = true; if (!((Thread)var11).isAlive()) { try { var5 = new LDAPConnThread(var1, var2, var3, var4); var5.setMaxBacklog(this.getSearchConstraints().getMaxBacklog()); var6 = (Vector)m_threadConnTable.remove(var11); } catch (Exception var19) { throw new LDAPException("unable to establish connection", 52); } } break; } } if (var10) { break; } } if (!var10) { try { var5 = new LDAPConnThread(var1, var2, var3, var4); var5.setMaxBacklog(this.getSearchConstraints().getMaxBacklog()); var6 = new Vector(); var6.addElement(this); } catch (Exception var18) { throw new LDAPException("unable to establish connection", 52); } } if (var5 != null) { m_threadConnTable.put(var5, var6); int var21 = 0; for(int var22 = var6.size(); var21 < var22; ++var21) { LDAPConnection var23 = (LDAPConnection)var6.elementAt(var21); var5.register(var23); var23.field_0 = var5; } } } catch (Throwable var20) { throw var20; } this.authenticateSSLConnection(); return var5; } private void authenticateSSLConnection() throws LDAPException { if (this.m_factory != null && this.m_factory instanceof LDAPSSLSocketFactoryExt) { boolean var1 = ((LDAPSSLSocketFactoryExt)this.m_factory).isClientAuth(); if (var1) { this.authenticate((String)null, (String)"SASLExternalMechanism", "com.netscape.sasl.mechanisms", (Properties)null, (Object)null); } } } public void abandon(LDAPSearchResults var1) throws LDAPException { if (this.field_0 != null && var1 != null) { var1.abandon(); int var2 = var1.getID(); for(int var3 = 0; var3 < 3; ++var3) { try { this.field_0.abandon(var2); this.field_0.sendRequest(new JDAPAbandonRequest(var2), (LDAPResponseListener)null, this.defaultConstraints); break; } } if (this.field_0 == null) { throw new LDAPException("Failed to send abandon request to the server.", 80); } } } public void authenticate(String var1, String var2) throws LDAPException { this.authenticate(this.protocolVersion, var1, var2, this.defaultConstraints); } public void authenticate(String var1, String var2, LDAPSearchConstraints var3) throws LDAPException { this.authenticate(this.protocolVersion, var1, var2, var3); } public void authenticate(int var1, String var2, String var3) throws LDAPException { this.authenticate(var1, var2, var3, this.defaultConstraints); } public void authenticate(int var1, String var2, String var3, LDAPSearchConstraints var4) throws LDAPException { this.prevBoundDN = this.boundDN; this.prevBoundPasswd = this.boundPasswd; this.boundDN = var2; this.boundPasswd = var3; if (this.prevBoundDN != null && this.prevBoundPasswd != null) { this.m_anonymousBound = false; } else { this.m_anonymousBound = true; } this.bind(var1, true, var4); } public void authenticate(String var1, String var2, String var3, Properties var4, Object var5) throws LDAPException { try { Object[] var6 = new Object[]{var2, var3}; String[] var7 = new String[]{"java.lang.String", "java.lang.String"}; this.m_mechanismDriver = this.invokeMethod((Object)null, "com.netscape.sasl.SASLMechanismFactory", "getMechanismDriver", var6, var7); } catch (Exception var8) { throw new LDAPException(((Throwable)var8).toString(), 80); } this.m_securityProperties = var4; this.m_clientCB = var5; this.boundDN = var1; this.saslBind(true); } public void authenticate(String var1, String[] var2, String var3, Properties var4, Object var5) throws LDAPException { for(int var6 = 0; var6 < var2.length; ++var6) { try { this.authenticate(var1, var2[var6], var3, var4, var5); if (this.m_mechanismDriver != null) { return; } } catch (LDAPException var7) { } } throw new LDAPException("Failed to get mechanism driver", 80); } private void saslBind(boolean var1) throws LDAPException { this.saslBind = true; this.protocolVersion = 3; if (this.field_0 == null) { this.bound = false; this.field_0 = null; this.connect(); } if (this.bound && var1 && this.field_0.getClientCount() > 1) { this.disconnect(); this.connect(); } if (this.bound && var1 || !this.bound) { try { Object[] var2 = new Object[]{this.boundDN, "LDAP", null, this.m_securityProperties, this.m_clientCB}; String[] var3 = new String[]{"java.lang.String", "java.lang.String", "java.lang.String", "java.util.Properties", "com.netscape.sasl.SASLClientCB"}; String var4 = this.m_mechanismDriver.getClass().getName(); byte[] var5 = (byte[])this.invokeMethod(this.m_mechanismDriver, var4, "startAuthentication", var2, var3); boolean var6 = this.isExternalMechanism(var4); int var7 = 14; Object var8 = null; while(true) { boolean var10000; if (var7 == 0) { var10000 = true; } else { if (var7 != 14) { throw new LDAPException("Authentication failed", var7); } var10000 = false; } if (var10000) { Boolean var16 = (Boolean)this.invokeMethod(this.m_mechanismDriver, var4, "isComplete", (Object[])null, (String[])null); if (!var16) { throw new LDAPException("The server indicates that authentication is successful, but the SASL driver indicates that authentication is not yet done.", 80); } this.m_security = this.invokeMethod(this.m_mechanismDriver, var4, "getSecurityLayer", (Object[])null, (String[])null); this.field_0.setSecurityLayer(this.m_security); this.updateThreadConnTable(); return; } JDAPBindResponse var15 = this.saslBind(var5); var7 = ((JDAPResult)var15).getResultCode(); if (!var6) { String var9 = var15.getCredentials(); byte[] var10 = var9.getBytes(); Object[] var11 = new Object[]{var10}; String[] var12 = new String[]{"[B"}; var5 = (byte[])this.invokeMethod(this.m_mechanismDriver, var4, "evaluateResponse", var11, var12); } } } catch (LDAPException var13) { throw var13; } catch (Exception var14) { throw new LDAPException(((Throwable)var14).toString(), 80); } } } private boolean isExternalMechanism(String var1) { String var2 = var1; int var3 = var1.lastIndexOf(46); if (var3 >= 0 && var3 < var1.length() - 1) { var2 = var1.substring(var3 + 1); } return var2.equals("SASLExternalMechanism"); } private Object invokeMethod(Object var1, String var2, String var3, Object[] var4, String[] var5) throws LDAPException { try { Method var6 = this.getMethod(var2, var3, var5); return var6 != null ? var6.invoke(var1, var4) : null; } catch (Exception var7) { throw new LDAPException("Invoking " + var3 + ": " + ((Throwable)var7).toString(), 89); } } private Method getMethod(String var1, String var2, String[] var3) throws LDAPException { try { Object var4 = null; String var5 = ""; if (var3 != null) { for(int var6 = 0; var6 < var3.length; ++var6) { var5 = var5 + var3[var6].getClass().getName(); } } String var13 = var1 + "." + var2 + "." + var5; Method var12; if ((var12 = (Method)this.m_methodLookup.get(var13)) != null) { return var12; } else { Class var7 = Class.forName(var1); Method[] var8 = var7.getMethods(); for(int var9 = 0; var9 < var8.length; ++var9) { Class[] var10 = var8[var9].getParameterTypes(); if (var8[var9].getName().equals(var2) && this.signatureCorrect(var10, var3)) { this.m_methodLookup.put(var13, var8[var9]); return var8[var9]; } } throw new LDAPException("Method " + var2 + " not found in " + var1); } } catch (ClassNotFoundException var11) { throw new LDAPException("Class " + var1 + " not found"); } } private boolean signatureCorrect(Class[] var1, String[] var2) { if (var2 == null) { return true; } else if (var1.length != var2.length) { return false; } else { for(int var3 = 0; var3 < var1.length; ++var3) { if (!var1[var3].getName().equals(var2[var3])) { return false; } } return true; } } private boolean checkForSASLBindCompletion(int var1) throws LDAPException { if (var1 == 0) { return true; } else if (var1 == 14) { return false; } else { throw new LDAPException("Authentication failed", var1); } } private JDAPBindResponse saslBind(byte[] var1) throws LDAPException { this.saslBind = true; if (this.field_0 == null) { this.connect(); } LDAPResponseListener var2 = this.getResponseListener(); JDAPBindResponse var4; try { String var7 = (String)this.invokeMethod(this.m_mechanismDriver, this.m_mechanismDriver.getClass().getName(), "getMechanismName", (Object[])null, (String[])null); this.sendRequest(new JDAPBindRequest(this.protocolVersion, this.boundDN, var7, var1), var2, this.defaultConstraints); JDAPMessage var3 = var2.getResponse(); JDAPProtocolOp var8 = var3.getProtocolOp(); if (!(var8 instanceof JDAPBindResponse)) { throw new LDAPException("Unknown response from the server during SASL bind", 80); } var4 = (JDAPBindResponse)var8; } finally { this.releaseResponseListener(var2); } return var4; } private void bind(int var1, boolean var2, LDAPSearchConstraints var3) throws LDAPException { this.saslBind = false; if (this.field_0 == null) { this.bound = false; this.field_0 = null; this.connect(); } else if (!this.bound && var2 && this.field_0.getClientCount() > 1) { this.disconnect(); this.connect(); } if (!this.bound || var2) { if (this.m_anonymousBound || this.boundDN != null && this.boundPasswd != null || var2) { if (this.bound && var2) { if (this.protocolVersion == var1) { if (this.m_anonymousBound && (this.boundDN == null || this.boundPasswd == null)) { return; } if (!this.m_anonymousBound && this.boundDN != null && this.boundPasswd != null && this.boundDN.equals(this.prevBoundDN) && this.boundPasswd.equals(this.prevBoundPasswd)) { return; } } if (this.field_0.getClientCount() > 1) { this.disconnect(); this.connect(); } } this.protocolVersion = var1; LDAPResponseListener var4 = this.getResponseListener(); try { if (this.m_referralConnection != null) { this.m_referralConnection.disconnect(); this.m_referralConnection = null; } this.sendRequest(new JDAPBindRequest(this.protocolVersion, this.boundDN, this.boundPasswd), var4, var3); JDAPMessage var5 = var4.getResponse(); this.checkMsg(var5); } catch (LDAPReferralException var11) { this.m_referralConnection = this.createReferralConnection(var11, var3); } finally { this.releaseResponseListener(var4); } this.updateThreadConnTable(); } } } private void updateThreadConnTable() { Hashtable var1 = m_threadConnTable; synchronized(var1){} try { if (m_threadConnTable.containsKey(this.field_0)) { Vector var3 = (Vector)m_threadConnTable.get(this.field_0); int var4 = 0; for(int var5 = var3.size(); var4 < var5; ++var4) { LDAPConnection var6 = (LDAPConnection)var3.elementAt(var4); var6.bound = true; } } } catch (Throwable var8) { throw var8; } } private void sendRequest(JDAPProtocolOp var1, LDAPResponseListener var2, LDAPSearchConstraints var3) throws LDAPException { for(int var4 = 0; var4 < 3; ++var4) { try { this.field_0.sendRequest(var1, var2, var3); break; } } if (this.field_0 == null) { throw new LDAPException("The connection is not available", 80); } } private void bind(LDAPSearchConstraints var1) throws LDAPException { if (this.saslBind) { this.saslBind(false); } else { this.bind(this.protocolVersion, false, var1); } } public synchronized void disconnect() throws LDAPException { if (this.m_referralConnection != null) { this.m_referralConnection.disconnect(); this.m_referralConnection = null; } if (this.field_0 == null) { throw new LDAPException("unable to disconnect() without connecting", 80); } else { if (this.m_cache != null) { this.m_cache.cleanup(); this.m_cache = null; } this.deleteThreadConnEntry(); this.deregisterConnection(); } } private void deleteThreadConnEntry() { Hashtable var1 = m_threadConnTable; synchronized(var1){} try { Enumeration var3 = m_threadConnTable.keys(); while(var3.hasMoreElements()) { LDAPConnThread var4 = (LDAPConnThread)var3.nextElement(); Vector var5 = (Vector)m_threadConnTable.get(var4); Enumeration var6 = var5.elements(); while(var6.hasMoreElements()) { LDAPConnection var7 = (LDAPConnection)var6.nextElement(); if (var7.equals(this)) { var5.removeElement(var7); if (var5.size() == 0) { m_threadConnTable.remove(var4); } return; } } } } catch (Throwable var9) { throw var9; } } synchronized void deregisterConnection() { this.field_0.deregister(this); this.field_0 = null; this.bound = false; } public LDAPEntry read(String var1) throws LDAPException { return this.read(var1, (String[])null, this.defaultConstraints); } public LDAPEntry read(String var1, LDAPSearchConstraints var2) throws LDAPException { return this.read(var1, (String[])null, var2); } public LDAPEntry read(String var1, String[] var2) throws LDAPException { return this.read(var1, var2, this.defaultConstraints); } public LDAPEntry read(String var1, String[] var2, LDAPSearchConstraints var3) throws LDAPException { LDAPSearchResults var4 = this.search(var1, 0, "(objectClass=*)", var2, false, var3); return var4 == null ? null : var4.next(); } public static LDAPEntry read(LDAPUrl var0) throws LDAPException { String var1 = var0.getHost(); int var2 = var0.getPort(); if (var1 == null) { throw new LDAPException("no host for connection", 89); } else { String[] var3 = var0.getAttributeArray(); String var4 = var0.getDN(); LDAPConnection var6 = new LDAPConnection(); var6.connect(var1, var2); LDAPEntry var5 = var6.read(var4, var3); var6.disconnect(); return var5; } } public static LDAPSearchResults search(LDAPUrl var0) throws LDAPException { return search(var0, (LDAPSearchConstraints)null); } public static LDAPSearchResults search(LDAPUrl var0, LDAPSearchConstraints var1) throws LDAPException { String var2 = var0.getHost(); int var3 = var0.getPort(); if (var2 == null) { throw new LDAPException("no host for connection", 89); } else { String[] var4 = var0.getAttributeArray(); String var5 = var0.getDN(); String var6 = var0.getFilter(); if (var6 == null) { var6 = "(objectClass=*)"; } int var7 = var0.getScope(); LDAPConnection var8 = new LDAPConnection(); var8.connect(var2, var3); LDAPSearchResults var9; if (var1 != null) { var9 = var8.search(var5, var7, var6, var4, false, var1); } else { var9 = var8.search(var5, var7, var6, var4, false); } var9.closeOnCompletion(var8); return var9; } } public LDAPSearchResults search(String var1, int var2, String var3, String[] var4, boolean var5) throws LDAPException { return this.search(var1, var2, var3, var4, var5, this.defaultConstraints); } public LDAPSearchResults search(String var1, int var2, String var3, String[] var4, boolean var5, LDAPSearchConstraints var6) throws LDAPException { if (var6 == null) { var6 = this.defaultConstraints; } LDAPSearchResults var7 = new LDAPSearchResults(this, var6, var1, var2, var3, var4, var5); Object var8 = null; Long var9 = null; boolean var10 = true; try { if (this.m_cache != null) { var9 = this.m_cache.createKey(this.host, this.port, var1, var3, var2, var4, this.boundDN, var6); Vector var60 = (Vector)this.m_cache.getEntry(var9); if (var60 != null) { return new LDAPSearchResults(var60, this, var6, var1, var2, var3, var4, var5); } } } catch (LDAPException var53) { var10 = false; String var12 = "Exception: " + var53; } if (this.saslBind) { this.saslBind(false); } else { this.bind(this.protocolVersion, false, var6); } LDAPSearchListener var11 = this.getSearchListener(var6); int var61 = var6.getDereference(); JDAPSearchRequest var13 = new JDAPSearchRequest(var1, var2, var61, var6.getMaxResults(), var6.getTimeLimit(), var5, var3, var4); synchronized(var11){} try { boolean var16 = false; try { this.sendRequest(var13, var11, var6); var16 = true; } finally { if (!var16) { this.releaseSearchListener(var11); } } if (this.m_cache != null && var10) { var11.setKey(var9); } } catch (Throwable var55) { throw var55; } if (var6.getBatchSize() == 0) { try { JDAPMessage var64 = ((LDAPResponseListener)var11).getResponse(); Enumeration var17 = var11.getSearchResults(); try { this.checkSearchMsg(var7, var64, var6, var1, var2, var3, var4, var5); } catch (LDAPException var56) { JDAPProtocolOp var19 = var64.getProtocolOp(); if (!(var19 instanceof JDAPSearchResultReference) && !(var19 instanceof JDAPSearchResult)) { throw var56; } System.err.println("LDAPConnection.checkSearchMsg: ignoring bad referral"); } while(var17.hasMoreElements()) { JDAPMessage var18 = (JDAPMessage)var17.nextElement(); this.checkSearchMsg(var7, var18, var6, var1, var2, var3, var4, var5); } } catch (LDAPException var57) { throw var57; } finally { this.releaseSearchListener(var11); } } else { JDAPMessage var14 = var11.nextResult(); if (var14 == null) { var14 = ((LDAPResponseListener)var11).getResponse(); try { this.checkSearchMsg(var7, var14, var6, var1, var2, var3, var4, var5); } finally { this.releaseSearchListener(var11); } } else { try { this.checkSearchMsg(var7, var14, var6, var1, var2, var3, var4, var5); } catch (LDAPException var59) { if (!(var14.getProtocolOp() instanceof JDAPSearchResultReference)) { throw var59; } System.err.println("LDAPConnection.checkSearchMsg: ignoring bad referral"); } LDAPControl[] var15 = (LDAPControl[])getOption(12, var6); for(int var63 = 0; var15 != null && var63 < var15.length; ++var63) { if (var15[var63].getClass().getName().equals("netscape.ldap.controls.LDAPPersistSearchControl")) { var7.associatePersistentSearch(var11); return var7; } } var7.associate(var11); } } return var7; } void checkSearchMsg(LDAPSearchResults var1, JDAPMessage var2, LDAPSearchConstraints var3, String var4, int var5, String var6, String[] var7, boolean var8) throws LDAPException { try { this.checkMsg(var2); if (var2.getProtocolOp().getType() != 5) { var1.add(var2.getProtocolOp()); } } catch (LDAPReferralException var12) { Vector var10 = new Vector(); this.performReferrals((LDAPReferralException)var12, var3, 3, var4, var5, var6, var7, var8, (LDAPModification[])null, (LDAPEntry)null, (LDAPAttribute)null, var10); for(int var11 = 0; var11 < var10.size(); ++var11) { var1.addReferralEntries((LDAPSearchResults)var10.elementAt(var11)); } Object var14 = null; } catch (LDAPException var13) { if (var13.getLDAPResultCode() != 11 && var13.getLDAPResultCode() != 3 && var13.getLDAPResultCode() != 4) { throw var13; } else { var1.add(var13); } } } public boolean compare(String var1, LDAPAttribute var2) throws LDAPException { return this.compare(var1, var2, this.defaultConstraints); } public boolean compare(String var1, LDAPAttribute var2, LDAPSearchConstraints var3) throws LDAPException { if (this.saslBind) { this.saslBind(false); } else { this.bind(this.protocolVersion, false, var3); } LDAPResponseListener var4 = this.getResponseListener(); Enumeration var5 = var2.getByteValues(); byte[] var6 = (byte[])var5.nextElement(); String var7 = ""; try { var7 = new String(var6, "UTF8"); } catch (Throwable var19) { } JDAPAVA var8 = new JDAPAVA(var2.getName(), var7); boolean var22; try { this.sendRequest(new JDAPCompareRequest(var1, var8), var4, var3); JDAPMessage var9 = var4.getResponse(); int var13 = ((JDAPResult)var9.getProtocolOp()).getResultCode(); if (var13 != 5) { if (var13 == 6) { var22 = true; return var22; } this.checkMsg(var9); return false; } var22 = false; } catch (LDAPReferralException var20) { Vector var14 = new Vector(); this.performReferrals((LDAPReferralException)var20, var3, 14, var1, 0, (String)null, (String[])null, false, (LDAPModification[])null, (LDAPEntry)null, var2, var14); boolean var15 = false; if (var14.size() > 0) { var15 = (Boolean)var14.elementAt(0); } Object var24 = null; var22 = var15; return var22; } finally { this.releaseResponseListener(var4); } return var22; } public void add(LDAPEntry var1) throws LDAPException { this.add(var1, this.defaultConstraints); } public void add(LDAPEntry var1, LDAPSearchConstraints var2) throws LDAPException { if (this.saslBind) { this.saslBind(false); } else { this.bind(this.protocolVersion, false, var2); } LDAPResponseListener var3 = this.getResponseListener(); LDAPAttributeSet var4 = var1.getAttributeSet(); LDAPAttribute[] var5 = new LDAPAttribute[var4.size()]; for(int var6 = 0; var6 < var4.size(); ++var6) { var5[var6] = var4.elementAt(var6); } try { this.sendRequest(new JDAPAddRequest(var1.getDN(), var5), var3, var2); JDAPMessage var7 = var3.getResponse(); this.checkMsg(var7); } catch (LDAPReferralException var13) { this.performReferrals((LDAPReferralException)var13, var2, 8, (String)null, 0, (String)null, (String[])null, false, (LDAPModification[])null, var1, (LDAPAttribute)null, (Vector)null); } finally { this.releaseResponseListener(var3); } } public LDAPExtendedOperation extendedOperation(LDAPExtendedOperation var1) throws LDAPException { return this.extendedOperation(var1, this.defaultConstraints); } public LDAPExtendedOperation extendedOperation(LDAPExtendedOperation var1, LDAPSearchConstraints var2) throws LDAPException { if (this.saslBind) { this.saslBind(false); } else { this.bind(this.protocolVersion, false, var2); } LDAPResponseListener var3 = this.getResponseListener(); Object var4 = null; Object var5 = null; LDAPExtendedOperation var7; try { this.sendRequest(new JDAPExtendedRequest(var1.getID(), var1.getValue()), var3, var2); JDAPMessage var15 = var3.getResponse(); this.checkMsg(var15); JDAPExtendedResponse var10 = (JDAPExtendedResponse)var15.getProtocolOp(); byte[] var16 = var10.getValue(); String var6 = var10.getID(); return new LDAPExtendedOperation(var6, var16); } catch (LDAPReferralException var13) { var7 = this.performExtendedReferrals(var13, var2, var1); } finally { this.releaseResponseListener(var3); } return var7; } public void modify(String var1, LDAPModification var2) throws LDAPException { this.modify(var1, var2, this.defaultConstraints); } public void modify(String var1, LDAPModification var2, LDAPSearchConstraints var3) throws LDAPException { LDAPModification[] var4 = new LDAPModification[]{var2}; this.modify(var1, var4, var3); } public void modify(String var1, LDAPModificationSet var2) throws LDAPException { this.modify(var1, var2, this.defaultConstraints); } public void modify(String var1, LDAPModificationSet var2, LDAPSearchConstraints var3) throws LDAPException { LDAPModification[] var4 = new LDAPModification[var2.size()]; for(int var5 = 0; var5 < var2.size(); ++var5) { var4[var5] = var2.elementAt(var5); } this.modify(var1, var4, var3); } public void modify(String var1, LDAPModification[] var2) throws LDAPException { this.modify(var1, var2, this.defaultConstraints); } public void modify(String var1, LDAPModification[] var2, LDAPSearchConstraints var3) throws LDAPException { if (this.saslBind) { this.saslBind(false); } else { this.bind(this.protocolVersion, false, var3); } LDAPResponseListener var4 = this.getResponseListener(); Object var5 = null; try { this.sendRequest(new JDAPModifyRequest(var1, var2), var4, var3); JDAPMessage var13 = var4.getResponse(); this.checkMsg(var13); } catch (LDAPReferralException var11) { this.performReferrals((LDAPReferralException)var11, var3, 6, var1, 0, (String)null, (String[])null, false, var2, (LDAPEntry)null, (LDAPAttribute)null, (Vector)null); } finally { this.releaseResponseListener(var4); } } public void delete(String var1) throws LDAPException { this.delete(var1, this.defaultConstraints); } public void delete(String var1, LDAPSearchConstraints var2) throws LDAPException { if (this.saslBind) { this.saslBind(false); } else { this.bind(this.protocolVersion, false, var2); } LDAPResponseListener var3 = this.getResponseListener(); try { this.sendRequest(new JDAPDeleteRequest(var1), var3, var2); JDAPMessage var4 = var3.getResponse(); this.checkMsg(var4); } catch (LDAPReferralException var10) { this.performReferrals((LDAPReferralException)var10, var2, 10, var1, 0, (String)null, (String[])null, false, (LDAPModification[])null, (LDAPEntry)null, (LDAPAttribute)null, (Vector)null); } finally { this.releaseResponseListener(var3); } } public void rename(String var1, String var2, boolean var3) throws LDAPException { this.rename(var1, var2, (String)null, var3); } public void rename(String var1, String var2, boolean var3, LDAPSearchConstraints var4) throws LDAPException { this.rename(var1, var2, (String)null, var3, var4); } public void rename(String var1, String var2, String var3, boolean var4) throws LDAPException { this.rename(var1, var2, var3, var4, this.defaultConstraints); } public void rename(String var1, String var2, String var3, boolean var4, LDAPSearchConstraints var5) throws LDAPException { if (this.saslBind) { this.saslBind(false); } else { this.bind(this.protocolVersion, false, var5); } LDAPResponseListener var6 = this.getResponseListener(); try { Object var10 = null; JDAPModifyRDNRequest var15; if (var3 != null) { var15 = new JDAPModifyRDNRequest(var1, var2, var4, var3); } else { var15 = new JDAPModifyRDNRequest(var1, var2, var4); } this.sendRequest(var15, var6, var5); JDAPMessage var7 = var6.getResponse(); this.checkMsg(var7); } catch (LDAPReferralException var13) { this.performReferrals((LDAPReferralException)var13, var5, 12, var1, 0, var2, (String[])null, var4, (LDAPModification[])null, (LDAPEntry)null, (LDAPAttribute)null, (Vector)null); } finally { this.releaseResponseListener(var6); } } public Object getOption(int var1) throws LDAPException { return var1 == 17 ? new Integer(this.protocolVersion) : getOption(var1, this.defaultConstraints); } private static Object getOption(int var0, LDAPSearchConstraints var1) throws LDAPException { switch (var0) { case 2: return new Integer(var1.getDereference()); case 3: return new Integer(var1.getMaxResults()); case 4: return new Integer(var1.getTimeLimit()); case 8: return new Boolean(var1.getReferrals()); case 9: return var1.getRebindProc(); case 10: return new Integer(var1.getHopLimit()); case 11: return var1.getClientControls(); case 12: return var1.getServerControls(); case 20: return new Integer(var1.getBatchSize()); case 30: return new Integer(var1.getMaxBacklog()); default: throw new LDAPException("invalid option", 89); } } public void setOption(int var1, Object var2) throws LDAPException { if (var1 == 17) { int var4 = (Integer)var2; this.protocolVersion = var4; } else { setOption(var1, var2, this.defaultConstraints); if (var1 == 30 && this.field_0 != null) { int var3 = (Integer)var2; if (var3 >= 1) { this.field_0.setMaxBacklog(var3); } } } } private static void setOption(int var0, Object var1, LDAPSearchConstraints var2) throws LDAPException { try { switch (var0) { case 2: var2.setDereference((Integer)var1); return; case 3: var2.setMaxResults((Integer)var1); return; case 4: var2.setTimeLimit((Integer)var1); return; case 8: var2.setReferrals((Boolean)var1); return; case 9: var2.setRebindProc((LDAPRebind)var1); return; case 10: var2.setHopLimit((Integer)var1); return; case 11: if (var1 == null) { var2.setClientControls((LDAPControl[])null); return; } else if (var1 instanceof LDAPControl) { var2.setClientControls((LDAPControl)var1); return; } else { if (var1 instanceof LDAPControl[]) { var2.setClientControls((LDAPControl[])var1); return; } throw new LDAPException("invalid LDAPControl", 89); } case 12: if (var1 == null) { var2.setServerControls((LDAPControl[])null); return; } else if (var1 instanceof LDAPControl) { var2.setServerControls((LDAPControl)var1); return; } else { if (var1 instanceof LDAPControl[]) { var2.setServerControls((LDAPControl[])var1); return; } throw new LDAPException("invalid LDAPControl", 89); } case 20: var2.setBatchSize((Integer)var1); return; case 30: int var3 = (Integer)var1; if (var3 < 1) { throw new LDAPException("MAXBACKLOG must be at least 1", 89); } var2.setMaxBacklog((Integer)var1); return; default: throw new LDAPException("invalid option", 89); } } catch (ClassCastException var4) { throw new LDAPException("invalid option value", 89); } } public LDAPControl[] getResponseControls() { LDAPControl[] var1 = null; Hashtable var2 = this.m_responseControlTable; synchronized(var2){} try { Vector var4 = (Vector)this.m_responseControlTable.get(this.field_0); if (var4 != null) { int var5 = 0; for(int var6 = var4.size(); var5 < var6; ++var5) { ResponseControl var7 = (ResponseControl)var4.elementAt(var5); if (var7.getConnection().equals(this)) { var1 = var7.getControls(); var4.removeElementAt(var5); break; } } } } catch (Throwable var9) { throw var9; } return var1; } public LDAPSearchConstraints getSearchConstraints() { return this.defaultConstraints; } private synchronized LDAPResponseListener getResponseListener() { if (this.responseListeners == null) { this.responseListeners = new Vector(5); } LDAPResponseListener var1; if (this.responseListeners.size() < 1) { var1 = new LDAPResponseListener(this); } else { var1 = (LDAPResponseListener)this.responseListeners.elementAt(0); this.responseListeners.removeElementAt(0); } return var1; } private synchronized LDAPSearchListener getSearchListener(LDAPSearchConstraints var1) { if (this.searchListeners == null) { this.searchListeners = new Vector(5); } LDAPSearchListener var2; if (this.searchListeners.size() < 1) { var2 = new LDAPSearchListener(this, var1); } else { var2 = (LDAPSearchListener)this.searchListeners.elementAt(0); this.searchListeners.removeElementAt(0); } return var2; } private synchronized void releaseResponseListener(LDAPResponseListener var1) { if (this.responseListeners == null) { this.responseListeners = new Vector(5); } var1.reset(); this.responseListeners.addElement(var1); } synchronized void releaseSearchListener(LDAPSearchListener var1) { if (this.searchListeners == null) { this.searchListeners = new Vector(5); } var1.reset(); this.searchListeners.addElement(var1); } void checkMsg(JDAPMessage var1) throws LDAPException { if (var1.getProtocolOp() instanceof JDAPResult) { JDAPResult var4 = (JDAPResult)var1.getProtocolOp(); int var3 = var4.getResultCode(); if (var3 != 0) { if (var3 == 10) { throw new LDAPReferralException("referral", var3, var4.getReferrals()); } else if (var3 == 9) { throw new LDAPReferralException("referral", var3, var4.getErrorMessage()); } else { throw new LDAPException("error result", var3, var4.getErrorMessage(), var4.getMatchedDN()); } } } else if (var1.getProtocolOp() instanceof JDAPSearchResultReference) { String[] var2 = ((JDAPSearchResultReference)var1.getProtocolOp()).getUrls(); throw new LDAPReferralException("referral", 0, var2); } } void setResponseControls(LDAPConnThread var1, ResponseControl var2) { Hashtable var3 = this.m_responseControlTable; synchronized(var3){} try { Vector var5 = (Vector)this.m_responseControlTable.get(var1); if (var5 != null && var5.size() > 0) { for(int var6 = var5.size() - 1; var6 >= 0; --var6) { ResponseControl var7 = (ResponseControl)var5.elementAt(var6); if (var7.getConnection().equals(this) && (var2 == null || var2.getMsgID() != var7.getMsgID())) { var5.removeElement(var7); } } } else if (var2 != null) { var5 = new Vector(); } if (var2 != null) { var5.addElement(var2); this.m_responseControlTable.put(var1, var5); } Enumeration var10 = this.m_attachedList.elements(); while(var10.hasMoreElements()) { LDAPConnThread var11 = (LDAPConnThread)var10.nextElement(); if (!((Thread)var11).isAlive()) { this.m_responseControlTable.remove(var11); this.m_attachedList.removeElement(var11); } } } catch (Throwable var9) { throw var9; } if (this.m_attachedList.indexOf(var1) < 0) { this.m_attachedList.addElement(var1); } } private LDAPConnection prepareReferral(LDAPUrl var1, LDAPSearchConstraints var2) throws LDAPException { LDAPConnection var3 = new LDAPConnection(this.getSocketFactory()); var3.setOption(8, new Boolean(true)); var3.setOption(9, var2.getRebindProc()); var3.setOption(17, new Integer(this.protocolVersion)); var3.setOption(10, new Integer(var2.getHopLimit() - 1)); var3.connect(var1.getHost(), var1.getPort()); return var3; } LDAPConnection createReferralConnection(LDAPReferralException var1, LDAPSearchConstraints var2) throws LDAPException { if (var2.getHopLimit() <= 0) { throw new LDAPException("exceed hop limit", ((LDAPException)var1).getLDAPResultCode(), ((LDAPException)var1).getLDAPErrorMessage()); } else if (!var2.getReferrals()) { throw var1; } else { LDAPUrl[] var3 = var1.getURLs(); if (var3 != null && var3.length > 0 && !var3[0].equals("")) { LDAPConnection var4 = null; var4 = this.prepareReferral(var3[0], var2); String var5 = var3[0].getDN(); if (var5 == null || var5.equals("")) { var5 = this.boundDN; } var4.authenticate(this.protocolVersion, var5, this.boundPasswd); return var4; } else { throw new LDAPException("No target URL in referral", 94); } } } void performReferrals(LDAPReferralException var1, LDAPSearchConstraints var2, int var3, String var4, int var5, String var6, String[] var7, boolean var8, LDAPModification[] var9, LDAPEntry var10, LDAPAttribute var11, Vector var12) throws LDAPException { if (var2.getHopLimit() <= 0) { throw new LDAPException("exceed hop limit", ((LDAPException)var1).getLDAPResultCode(), ((LDAPException)var1).getLDAPErrorMessage()); } else if (!var2.getReferrals()) { if (var3 == 3) { LDAPSearchResults var21 = new LDAPSearchResults(); var21.add(var1); var12.addElement(var21); } else { throw var1; } } else { LDAPUrl[] var13 = var1.getURLs(); if (var13 != null) { for(int var14 = 0; var14 < var13.length; ++var14) { String var15 = var13[var14].getDN(); Object var16 = null; String var22; if (var15 != null && !var15.equals("")) { var22 = var15; } else { var22 = var4; } if (var13[var14].getUrl().indexOf("?base") > -1) { var5 = 0; } LDAPSearchConstraints var17 = (LDAPSearchConstraints)var2.clone(); var17.setHopLimit(var2.getHopLimit() - 1); try { if (this.m_referralConnection != null && var13[var14].getHost().equals(this.m_referralConnection.host) && var13[var14].getPort() == this.m_referralConnection.port) { this.performReferrals(this.m_referralConnection, var17, var3, var22, var5, var6, var7, var8, var9, var10, var11, var12); continue; } } catch (LDAPException var20) { if (var20.getLDAPResultCode() != 50) { throw var20; } } LDAPConnection var18 = null; var18 = this.prepareReferral(var13[var14], var2); if (var2.getRebindProc() == null) { var18.authenticate((String)null, (String)null); } else { LDAPRebindAuth var19 = var2.getRebindProc().getRebindAuthentication(var13[var14].getHost(), var13[var14].getPort()); var18.authenticate(var19.getDN(), var19.getPassword()); } this.performReferrals(var18, var17, var3, var22, var5, var6, var7, var8, var9, var10, var11, var12); } } } } void performReferrals(LDAPConnection var1, LDAPSearchConstraints var2, int var3, String var4, int var5, String var6, String[] var7, boolean var8, LDAPModification[] var9, LDAPEntry var10, LDAPAttribute var11, Vector var12) throws LDAPException { LDAPSearchResults var13 = null; try { switch (var3) { case 3: var13 = var1.search(var4, var5, var6, var7, var8, var2); if (var13 != null) { var13.closeOnCompletion(var1); var12.addElement(var13); } else if (this.m_referralConnection == null || !var1.equals(this.m_referralConnection)) { var1.disconnect(); } break; case 6: var1.modify(var4, var9, var2); break; case 8: if (var4 != null && !var4.equals("")) { var10.setDN(var4); } var1.add(var10, var2); break; case 10: var1.delete(var4, var2); break; case 12: var1.rename(var4, var6, var8, var2); break; case 14: boolean var16 = var1.compare(var4, var11, var2); var12.addElement(new Boolean(var16)); } } catch (LDAPException var19) { throw var19; } finally { if (var1 != null && (var3 != 3 || var13 == null) && (this.m_referralConnection == null || !var1.equals(this.m_referralConnection))) { var1.disconnect(); } } } private LDAPExtendedOperation performExtendedReferrals(LDAPReferralException var1, LDAPSearchConstraints var2, LDAPExtendedOperation var3) throws LDAPException { if (var2.getHopLimit() <= 0) { throw new LDAPException("exceed hop limit", ((LDAPException)var1).getLDAPResultCode(), ((LDAPException)var1).getLDAPErrorMessage()); } else if (!var2.getReferrals()) { throw var1; } else { LDAPUrl[] var4 = var1.getURLs(); if (var4 == null) { return null; } else { for(int var5 = 0; var5 < var4.length; ++var5) { try { LDAPConnection var6 = this.prepareReferral(var4[var5], var2); LDAPExtendedOperation var7 = var6.extendedOperation(var3); var6.disconnect(); return var7; } } return null; } } } public synchronized Object clone() { try { LDAPConnection var1 = (LDAPConnection)super.clone(); if (this.field_0 == null) { LDAPSearchConstraints var2 = this.defaultConstraints; if (this.saslBind) { this.saslBind(false); } else { this.bind(this.protocolVersion, false, var2); } } var1.defaultConstraints = (LDAPSearchConstraints)this.defaultConstraints.clone(); var1.responseListeners = null; var1.searchListeners = null; var1.bound = this.bound; var1.host = this.host; var1.port = this.port; var1.boundDN = this.boundDN; var1.boundPasswd = this.boundPasswd; var1.prevBoundDN = this.prevBoundDN; var1.prevBoundPasswd = this.prevBoundPasswd; var1.m_anonymousBound = this.m_anonymousBound; var1.m_factory = this.m_factory; var1.field_0 = this.field_0; Hashtable var3 = m_threadConnTable; synchronized(var3){} label59: { Object var10; try { Vector var5 = (Vector)m_threadConnTable.get(this.field_0); if (var5 != null) { var5.addElement(var1); break label59; } var10 = null; } catch (Throwable var8) { throw var8; } return var10; } var1.field_0.register(var1); return var1; } catch (Exception var9) { return null; } } void resultRetrieved() { if (this.field_0 != null) { this.field_0.resultRetrieved(); } } private static boolean checkCommunicator() { try { Method var0 = LDAPCheckComm.getMethod("netscape.security.PrivilegeManager", "enablePrivilege"); if (var0 == null) { return false; } Object[] var5 = new Object[]{new String("UniversalConnect")}; var0.invoke((Object)null, var5); return true; } catch (LDAPException var2) { String var4 = "Exception: " + var2.toString(); } catch (Exception var3) { String var1 = "Exception on invoking enablePrivilege: " + ((Throwable)var3).toString(); } return false; } public static boolean isNetscape() { return isCommunicator; } static void printDebug(String var0) { } public static void main(String[] var0) { System.out.println("LDAP SDK Version is " + SdkVersion); System.out.println("LDAP Protocol Version is " + ProtocolVersion); } }